Whoops. Forgot this a couple months ago. Now GtkTreeStore sort of sorts.
authorJonathan Blandford <jrb@redhat.com>
Thu, 14 Jun 2001 23:25:52 +0000 (23:25 +0000)
committerJonathan Blandford <jrb@src.gnome.org>
Thu, 14 Jun 2001 23:25:52 +0000 (23:25 +0000)
Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>

* gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
finish it off tonight, though it basically works now when it's a
list.  Also, I have a sinking feeling neither GtkTreeStore or
GtkListStore actually resort when adding a new item.  I'll look
into it.

16 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkliststore.c
gtk/gtktreemodel.c
gtk/gtktreemodelsort.c
gtk/gtktreemodelsort.h
gtk/gtktreestore.c
gtk/gtktreeview.c
tests/testtreesort.c
tests/testtreeview.c
tests/treestoretest.c

index f79fcbca8a6335a1064b6a0c65ef4ec91c1c525a..2d4e12ceb9af8a96b0ebb124f42219ad9e6af5d0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
+       this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
+       finish it off tonight, though it basically works now when it's a
+       list.  Also, I have a sinking feeling neither GtkTreeStore or
+       GtkListStore actually resort when adding a new item.  I'll look
+       into it.
+
 2001-06-14  Havoc Pennington  <hp@redhat.com>
 
        * demos/gtk-demo/main.c (load_file): fix bug identified by
index f79fcbca8a6335a1064b6a0c65ef4ec91c1c525a..2d4e12ceb9af8a96b0ebb124f42219ad9e6af5d0 100644 (file)
@@ -1,3 +1,12 @@
+Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
+       this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
+       finish it off tonight, though it basically works now when it's a
+       list.  Also, I have a sinking feeling neither GtkTreeStore or
+       GtkListStore actually resort when adding a new item.  I'll look
+       into it.
+
 2001-06-14  Havoc Pennington  <hp@redhat.com>
 
        * demos/gtk-demo/main.c (load_file): fix bug identified by
index f79fcbca8a6335a1064b6a0c65ef4ec91c1c525a..2d4e12ceb9af8a96b0ebb124f42219ad9e6af5d0 100644 (file)
@@ -1,3 +1,12 @@
+Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
+       this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
+       finish it off tonight, though it basically works now when it's a
+       list.  Also, I have a sinking feeling neither GtkTreeStore or
+       GtkListStore actually resort when adding a new item.  I'll look
+       into it.
+
 2001-06-14  Havoc Pennington  <hp@redhat.com>
 
        * demos/gtk-demo/main.c (load_file): fix bug identified by
index f79fcbca8a6335a1064b6a0c65ef4ec91c1c525a..2d4e12ceb9af8a96b0ebb124f42219ad9e6af5d0 100644 (file)
@@ -1,3 +1,12 @@
+Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
+       this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
+       finish it off tonight, though it basically works now when it's a
+       list.  Also, I have a sinking feeling neither GtkTreeStore or
+       GtkListStore actually resort when adding a new item.  I'll look
+       into it.
+
 2001-06-14  Havoc Pennington  <hp@redhat.com>
 
        * demos/gtk-demo/main.c (load_file): fix bug identified by
index f79fcbca8a6335a1064b6a0c65ef4ec91c1c525a..2d4e12ceb9af8a96b0ebb124f42219ad9e6af5d0 100644 (file)
@@ -1,3 +1,12 @@
+Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
+       this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
+       finish it off tonight, though it basically works now when it's a
+       list.  Also, I have a sinking feeling neither GtkTreeStore or
+       GtkListStore actually resort when adding a new item.  I'll look
+       into it.
+
 2001-06-14  Havoc Pennington  <hp@redhat.com>
 
        * demos/gtk-demo/main.c (load_file): fix bug identified by
index f79fcbca8a6335a1064b6a0c65ef4ec91c1c525a..2d4e12ceb9af8a96b0ebb124f42219ad9e6af5d0 100644 (file)
@@ -1,3 +1,12 @@
+Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
+       this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
+       finish it off tonight, though it basically works now when it's a
+       list.  Also, I have a sinking feeling neither GtkTreeStore or
+       GtkListStore actually resort when adding a new item.  I'll look
+       into it.
+
 2001-06-14  Havoc Pennington  <hp@redhat.com>
 
        * demos/gtk-demo/main.c (load_file): fix bug identified by
index f79fcbca8a6335a1064b6a0c65ef4ec91c1c525a..2d4e12ceb9af8a96b0ebb124f42219ad9e6af5d0 100644 (file)
@@ -1,3 +1,12 @@
+Thu Jun 14 19:21:27 2001  Jonathan Blandford  <jrb@redhat.com>
+
+       * gtk/gtktreestore.c (gtk_tree_store_sort_helper): Whoops.  Forgot
+       this a couple months ago.  Now GtkTreeStore sort of sorts.  I'll
+       finish it off tonight, though it basically works now when it's a
+       list.  Also, I have a sinking feeling neither GtkTreeStore or
+       GtkListStore actually resort when adding a new item.  I'll look
+       into it.
+
 2001-06-14  Havoc Pennington  <hp@redhat.com>
 
        * demos/gtk-demo/main.c (load_file): fix bug identified by
index 38d5afd6670159e896b48f51ab107d67022d4b5b..bfaf22a5586a124e07466a9fde2b83939949bcac 100644 (file)
@@ -1347,9 +1347,9 @@ typedef struct _SortTuple
 } SortTuple;
 
 static gint
-_gtk_list_store_compare_func (gconstpointer a,
-                             gconstpointer b,
-                             gpointer      user_data)
+gtk_list_store_compare_func (gconstpointer a,
+                            gconstpointer b,
+                            gpointer      user_data)
 {
   GtkListStore *list_store = user_data;
   GtkTreeDataSortHeader *header = NULL;
@@ -1394,7 +1394,6 @@ gtk_list_store_sort (GtkListStore *list_store)
   GtkTreeIter iter;
   GArray *sort_array;
   gint i;
-  GList *header_list;
   gint *new_order;
   GSList *list;
   GtkTreePath *path;
@@ -1404,12 +1403,7 @@ gtk_list_store_sort (GtkListStore *list_store)
 
   g_assert (GTK_LIST_STORE_IS_SORTED (list_store));
 
-  for (header_list = list_store->sort_list; header_list; header_list = header_list->next)
-    {
-      header = (GtkTreeDataSortHeader*) header_list->data;
-      if (header->sort_column_id == list_store->sort_column_id)
-       break;
-    }
+  header = _gtk_tree_data_list_get_header (list_store->sort_list, list_store->sort_column_id);
 
   /* We want to make sure that we have a function */
   g_return_if_fail (header != NULL);
@@ -1435,7 +1429,7 @@ gtk_list_store_sort (GtkListStore *list_store)
       list = list->next;
     }
 
-  g_array_sort_with_data (sort_array, _gtk_list_store_compare_func, list_store);
+  g_array_sort_with_data (sort_array, gtk_list_store_compare_func, list_store);
 
   for (i = 0; i < list_store->length - 1; i++)
       g_array_index (sort_array, SortTuple, i).el->next =
index 244fca757d551e43b3644ba425cd6fbc175581a6..f71d88c1e32db3bc6fff669cdcab7bc0073263e9 100644 (file)
@@ -576,8 +576,8 @@ gtk_tree_iter_free (GtkTreeIter *iter)
  * @tree_model: A #GtkTreeModel.
  *
  * Returns a set of flags supported by this interface.  The flags are a bitwise
- * combination of #GtkTreeModelFlags.  It is expected that the flags supported
- * do not change for an interface.
+ * combination of #GtkTreeModelFlags.  The flags supported should not change
+ * during the lifecycle of the tree_model.
  *
  * Return value: The flags supported by this interface.
  **/
index 91ea606d9c3b8d4c186f2d29ca0b46b552827b41..657e4afdea144854661deffc40de38a96b9196fc 100644 (file)
  */
 
 #include "gtktreemodelsort.h"
+#include "gtktreesortable.h"
 #include "gtksignal.h"
+#include "gtktreedatalist.h"
 #include <string.h>
 
+
+
 typedef struct _SortElt SortElt;
 struct _SortElt
 {
@@ -53,6 +57,7 @@ struct _SortData
 static void         gtk_tree_model_sort_init            (GtkTreeModelSort      *tree_model_sort);
 static void         gtk_tree_model_sort_class_init      (GtkTreeModelSortClass *tree_model_sort_class);
 static void         gtk_tree_model_sort_tree_model_init (GtkTreeModelIface     *iface);
+static void         gtk_tree_model_sort_tree_sortable_init (GtkTreeSortableIface   *iface);
 static void         gtk_tree_model_sort_finalize        (GObject               *object);
 static void         gtk_tree_model_sort_range_changed   (GtkTreeModel          *model,
                                                         GtkTreePath           *start_path,
@@ -104,6 +109,19 @@ static void         gtk_tree_model_sort_ref_node        (GtkTreeModel          *
 static void         gtk_tree_model_sort_unref_node      (GtkTreeModel          *tree_model,
                                                         GtkTreeIter           *iter);
 
+/* sortable */
+static gboolean gtk_tree_model_sort_get_sort_column_id      (GtkTreeSortable        *sortable,
+                                                            gint                   *sort_column_id,
+                                                            GtkTreeSortOrder       *order);
+static void     gtk_tree_model_sort_set_sort_column_id      (GtkTreeSortable        *sortable,
+                                                            gint                    sort_column_id,
+                                                            GtkTreeSortOrder        order);
+static void     gtk_tree_model_sort_sort_column_id_set_func (GtkTreeSortable        *sortable,
+                                                            gint                    sort_column_id,
+                                                            GtkTreeIterCompareFunc  func,
+                                                            gpointer                data,
+                                                            GtkDestroyNotify        destroy);
+
 /* Internal functions */
 static gint         gtk_tree_model_sort_array_find_insert (GtkTreeModelSort *tree_model_sort,
                                                           GArray           *array,
@@ -115,14 +133,6 @@ static GtkTreePath *gtk_tree_model_sort_convert_path_real (GtkTreeModelSort *tre
 static void         gtk_tree_model_sort_build_level       (GtkTreeModelSort *tree_model_sort,
                                                           SortElt          *place);
 static void         gtk_tree_model_sort_free_level        (GArray           *array);
-static GFunc        gtk_tree_model_sort_get_func          (GtkTreeModelSort *tree_model_sort);
-static gint         gtk_tree_model_sort_func              (gconstpointer     a,
-                                                          gconstpointer     b,
-                                                          gpointer          user_data);
-static gint         g_value_string_compare_func           (const GValue     *a,
-                                                          const GValue     *b);
-static gint         g_value_int_compare_func              (const GValue     *a,
-                                                          const GValue     *b);
 
 
 
@@ -153,10 +163,21 @@ gtk_tree_model_sort_get_type (void)
        NULL
       };
 
+      static const GInterfaceInfo sortable_info =
+      {
+       (GInterfaceInitFunc) gtk_tree_model_sort_tree_sortable_init,
+       NULL,
+       NULL
+      };
+
       tree_model_sort_type = g_type_register_static (G_TYPE_OBJECT, "GtkTreeModelSort", &tree_model_sort_info, 0);
       g_type_add_interface_static (tree_model_sort_type,
                                   GTK_TYPE_TREE_MODEL,
                                   &tree_model_info);
+
+      g_type_add_interface_static (tree_model_sort_type,
+                                  GTK_TYPE_TREE_SORTABLE,
+                                  &sortable_info);
     }
 
   return tree_model_sort_type;
@@ -190,9 +211,18 @@ gtk_tree_model_sort_tree_model_init (GtkTreeModelIface *iface)
   iface->unref_node = gtk_tree_model_sort_unref_node;
 }
 
+static void
+gtk_tree_model_sort_tree_sortable_init (GtkTreeSortableIface *iface)
+{
+  iface->get_sort_column_id = gtk_tree_model_sort_get_sort_column_id;
+  iface->set_sort_column_id = gtk_tree_model_sort_set_sort_column_id;
+  iface->sort_column_id_set_func = gtk_tree_model_sort_sort_column_id_set_func;
+}
+
 static void
 gtk_tree_model_sort_init (GtkTreeModelSort *tree_model_sort)
 {
+  tree_model_sort->sort_column_id = -1;
   tree_model_sort->stamp = g_random_int ();
 }
 
@@ -203,17 +233,13 @@ gtk_tree_model_sort_new (void)
 }
 
 GtkTreeModel *
-gtk_tree_model_sort_new_with_model (GtkTreeModel      *child_model,
-                                   GValueCompareFunc  func,
-                                   gint               sort_col)
+gtk_tree_model_sort_new_with_model (GtkTreeModel      *child_model)
 {
   GtkTreeModel *retval;
 
   retval = gtk_tree_model_sort_new ();
   gtk_tree_model_sort_set_model (GTK_TREE_MODEL_SORT (retval), child_model);
 
-  GTK_TREE_MODEL_SORT (retval)->func = func;
-  GTK_TREE_MODEL_SORT (retval)->sort_col = sort_col;
   return retval;
 }
 
@@ -249,35 +275,56 @@ gtk_tree_model_sort_set_model (GtkTreeModelSort *tree_model_sort,
       g_object_unref (G_OBJECT (tree_model_sort->child_model));
     }
 
-  tree_model_sort->child_model = child_model;
+  if (tree_model_sort->root)
+    {
+      gtk_tree_model_sort_free_level (tree_model_sort->root);
+      tree_model_sort->root;
+    }
+
+  if (tree_model_sort->sort_list)
+    {
+      _gtk_tree_data_list_header_free (tree_model_sort->sort_list);
+      tree_model_sort->sort_list = NULL;
+    }
 
+  tree_model_sort->child_model = child_model;
   if (child_model)
     {
+      GType *types;
+      gint i, n_columns;
+
       tree_model_sort->changed_id =
        g_signal_connectc (child_model,
                           "range_changed",
-                          gtk_tree_model_sort_range_changed,
+                          G_CALLBACK (gtk_tree_model_sort_range_changed),
                           tree_model_sort,
                           FALSE);
       tree_model_sort->inserted_id = 
        g_signal_connectc (child_model,
-                         "inserted",
-                         gtk_tree_model_sort_inserted,
+                          "inserted",
+                          G_CALLBACK (gtk_tree_model_sort_inserted),
                           tree_model_sort,
                           FALSE);
       tree_model_sort->has_child_toggled_id = 
        g_signal_connectc (child_model,
                           "has_child_toggled",
-                          gtk_tree_model_sort_has_child_toggled,
+                          G_CALLBACK (gtk_tree_model_sort_has_child_toggled),
                           tree_model_sort,
                           FALSE);
       tree_model_sort->deleted_id =
        g_signal_connectc (child_model,
                           "deleted",
-                          gtk_tree_model_sort_deleted,
+                          G_CALLBACK (gtk_tree_model_sort_deleted),
                           tree_model_sort,
                           FALSE);
+
       tree_model_sort->flags = gtk_tree_model_get_flags (child_model);
+      n_columns = gtk_tree_model_get_n_columns (child_model);
+      types = g_new (GType, n_columns);
+      for (i = 0; i < n_columns; i++)
+       types[i] = gtk_tree_model_get_column_type (child_model, i);
+      tree_model_sort->sort_list = _gtk_tree_data_list_header_new (n_columns, types);
+      g_free (types);
     }
 }
 
@@ -333,6 +380,11 @@ gtk_tree_model_sort_finalize (GObject *object)
       g_object_unref (G_OBJECT (tree_model_sort->child_model));
       tree_model_sort->child_model = NULL;
     }
+  if (tree_model_sort->sort_list)
+    {
+      _gtk_tree_data_list_header_free (tree_model_sort->sort_list);
+      tree_model_sort->sort_list = NULL;
+    }
 }
 
 static void
@@ -594,8 +646,12 @@ gtk_tree_model_sort_deleted (GtkTreeModel *s_model,
 static gint
 gtk_tree_model_sort_get_n_columns (GtkTreeModel *tree_model)
 {
+  GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+
   g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (tree_model), 0);
-  g_return_val_if_fail (GTK_TREE_MODEL_SORT (tree_model)->child_model != NULL, 0);
+
+  if (tree_model_sort->child_model == 0)
+    return 0;
 
   return gtk_tree_model_get_n_columns (GTK_TREE_MODEL_SORT (tree_model)->child_model);
 }
@@ -857,6 +913,98 @@ gtk_tree_model_sort_unref_node (GtkTreeModel *tree_model,
                                GtkTreeIter  *iter)
 {
 
+}
+
+static gboolean
+gtk_tree_model_sort_get_sort_column_id (GtkTreeSortable  *sortable,
+                                       gint             *sort_column_id,
+                                       GtkTreeSortOrder *order)
+{
+  GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) sortable;
+
+  g_return_val_if_fail (sortable != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_TREE_MODEL_SORT (sortable), FALSE);
+
+  if (tree_model_sort->sort_column_id == -1)
+    return FALSE;
+
+  if (sort_column_id)
+    *sort_column_id = tree_model_sort->sort_column_id;
+  if (order)
+    *order = tree_model_sort->order;
+
+  return TRUE;
+}
+
+static void
+gtk_tree_model_sort_set_sort_column_id (GtkTreeSortable  *sortable,
+                                       gint              sort_column_id,
+                                       GtkTreeSortOrder  order)
+{
+  GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) sortable;
+  GList *list;
+
+  g_return_if_fail (sortable != NULL);
+  g_return_if_fail (GTK_IS_TREE_MODEL_SORT (sortable));
+
+  for (list = tree_model_sort->sort_list; list; list = list->next)
+    {
+      GtkTreeDataSortHeader *header = (GtkTreeDataSortHeader*) list->data;
+      if (header->sort_column_id == sort_column_id)
+       break;
+    }
+  g_return_if_fail (list != NULL);
+
+  if ((tree_model_sort->sort_column_id == sort_column_id) &&
+      (tree_model_sort->order == order))
+    return;
+
+  tree_model_sort->sort_column_id = sort_column_id;
+  tree_model_sort->order = order;
+
+  /*  if (tree_model_sort->sort_column_id >= 0)
+      gtk_list_store_sort (tree_model_sort);*/
+
+  gtk_tree_sortable_sort_column_changed (sortable);
+
+}
+
+static void
+gtk_tree_model_sort_sort_column_id_set_func (GtkTreeSortable        *sortable,
+                                            gint                    sort_column_id,
+                                            GtkTreeIterCompareFunc  func,
+                                            gpointer                data,
+                                            GtkDestroyNotify        destroy)
+{
+  GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) sortable;
+  GtkTreeDataSortHeader *header = NULL;
+  GList *list;
+
+  g_return_if_fail (sortable != NULL);
+  g_return_if_fail (GTK_IS_TREE_MODEL_SORT (sortable));
+  g_return_if_fail (func != NULL);
+
+  for (list = tree_model_sort->sort_list; list; list = list->next)
+    {
+      header = (GtkTreeDataSortHeader*) list->data;
+      if (header->sort_column_id == sort_column_id)
+       break;
+    }
+
+  if (header == NULL)
+    {
+      header = g_new0 (GtkTreeDataSortHeader, 1);
+      header->sort_column_id = sort_column_id;
+      tree_model_sort->sort_list = g_list_append (tree_model_sort->sort_list, header);
+    }
+
+  if (header->destroy)
+    (* header->destroy) (header->data);
+
+  header->func = func;
+  header->data = data;
+  header->destroy = destroy;
 }
 
 /* Internal functions */
@@ -874,11 +1022,11 @@ gtk_tree_model_sort_array_find_insert (GtkTreeModelSort *tree_model_sort,
   GValue tmp_value = {0, };
   SortElt *tmp_elt;
 
-  func = (GValueCompareFunc) gtk_tree_model_sort_get_func (tree_model_sort);
+  func = NULL; //(GValueCompareFunc) gtk_tree_model_sort_get_func (tree_model_sort);
 
   g_return_val_if_fail (func != NULL, 0);
 
-  gtk_tree_model_get_value (tree_model_sort->child_model, iter, tree_model_sort->sort_col, &value);
+  gtk_tree_model_get_value (tree_model_sort->child_model, iter, tree_model_sort->sort_column_id, &value);
 
   for (middle = 0; middle < array->len; middle++)
     {
@@ -888,7 +1036,7 @@ gtk_tree_model_sort_array_find_insert (GtkTreeModelSort *tree_model_sort,
          continue;
       gtk_tree_model_get_value (tree_model_sort->child_model,
                                (GtkTreeIter *) tmp_elt,
-                               tree_model_sort->sort_col,
+                               tree_model_sort->sort_column_id,
                                &tmp_value);
 
       cmp = ((func) (&value, &tmp_value));
@@ -1019,12 +1167,6 @@ gtk_tree_model_sort_build_level (GtkTreeModelSort *tree_model_sort,
       i++;
     }
   while (gtk_tree_model_iter_next (tree_model_sort->child_model, &iter));
-
-  sort_data.func = (GValueCompareFunc) gtk_tree_model_sort_get_func (tree_model_sort);
-  sort_data.model = tree_model_sort->child_model;
-  sort_data.sort_col = tree_model_sort->sort_col;
-
-  g_array_sort_with_data (children, gtk_tree_model_sort_func, &sort_data);
 }
 
 static void
@@ -1047,88 +1189,6 @@ gtk_tree_model_sort_free_level (GArray *array)
   g_array_free (array, TRUE);
 }
 
-static GFunc
-gtk_tree_model_sort_get_func (GtkTreeModelSort *tree_model_sort)
-{
-  GValueCompareFunc func;
-  if (tree_model_sort->func)
-    func = tree_model_sort->func;
-  else
-    {
-      switch (gtk_tree_model_get_column_type (tree_model_sort->child_model,
-                                             tree_model_sort->sort_col))
-       {
-       case G_TYPE_STRING:
-         func = &g_value_string_compare_func;
-         break;
-       case G_TYPE_INT:
-         func = &g_value_int_compare_func;
-         break;
-       default:
-         g_warning ("No comparison function for row %d (Type %s)\n",
-                    tree_model_sort->sort_col,
-                    g_type_name (gtk_tree_model_get_column_type (tree_model_sort->child_model,
-                                                                 tree_model_sort->sort_col)));
-         return NULL;
-       }
-
-    }
-  return (GFunc) func;
-}
-
-static gint
-gtk_tree_model_sort_func  (gconstpointer a,
-                          gconstpointer b,
-                          gpointer      user_data)
-{
-  GValue value_a = {0, };
-  GValue value_b = {0, };
-  SortData *sort_data = user_data;
-  gboolean retval;
-
-  gtk_tree_model_get_value (sort_data->model, (GtkTreeIter *) a, sort_data->sort_col, &value_a);
-  gtk_tree_model_get_value (sort_data->model, (GtkTreeIter *) b, sort_data->sort_col, &value_b);
-
-  retval = (sort_data->func) (&value_a, &value_b);
-
-  g_value_unset (&value_a);
-  g_value_unset (&value_b);
-
-  return retval;
-}
-  
-
-static gint
-g_value_string_compare_func (const GValue *a,
-                            const GValue *b)
-{
-  gchar *a_str = g_value_get_string (a);
-  gchar *b_str = g_value_get_string (b);
-
-  if (b_str == NULL)
-    return a_str == NULL;
-  if (a_str == NULL)
-    return -1;
-
-  return strcmp (a_str, b_str);
-}
-
-static gint
-g_value_int_compare_func (const GValue *a,
-                         const GValue *b)
-{
-  gint a_int = g_value_get_int (a);
-  gint b_int = g_value_get_int (b);
-
-  if (a_int < b_int)
-    return -1;
-  else if (a_int > b_int)
-    return 1;
-  else
-    return 0;
-}
-
-
 /* DEAD CODE */
 
 #if 0
@@ -1147,7 +1207,7 @@ g_value_int_compare_func (const GValue *a,
       tmp_elt = &(g_array_index (array, SortElt, middle));
       gtk_tree_model_get_value (sort->child_model,
                                (GtkTreeIter *) tmp_elt,
-                               sort->sort_col,
+                               sort->sort_column_id,
                                &tmp_value);
 
       cmp = ((func) (&tmp_value, &s_value));
index 192e030d3034b49516862a5ad0185f578967fed9..c780693117df93fb55c377dbc259ac50dcbb2bd1 100644 (file)
@@ -21,6 +21,7 @@
 #define __GTK_TREE_MODEL_SORT_H__
 
 #include <gtk/gtktreemodel.h>
+#include <gtk/gtktreesortable.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -48,9 +49,13 @@ struct _GtkTreeModelSort
   gint stamp;
   guint flags;
   GtkTreeModel *child_model;
-  gint sort_col;
-  GValueCompareFunc func;
 
+  /* sort information */
+  GList *sort_list;
+  gint sort_column_id;
+  GtkTreeSortOrder order;
+
+  /* signal ids */
   guint changed_id;
   guint inserted_id;
   guint has_child_toggled_id;
@@ -65,9 +70,7 @@ struct _GtkTreeModelSortClass
 
 GtkType       gtk_tree_model_sort_get_type       (void);
 GtkTreeModel *gtk_tree_model_sort_new            (void);
-GtkTreeModel *gtk_tree_model_sort_new_with_model (GtkTreeModel      *child_model,
-                                                 GValueCompareFunc  func,
-                                                 gint               sort_col);
+GtkTreeModel *gtk_tree_model_sort_new_with_model (GtkTreeModel      *child_model);
 void          gtk_tree_model_sort_set_model      (GtkTreeModelSort  *tree_model_sort,
                                                  GtkTreeModel      *child_model);
 GtkTreeModel *gtk_tree_model_sort_get_model      (GtkTreeModelSort  *tree_model);
index e7753b12776ea9152660b766060b18c0ca855204..b6e8f0ea98d923a89b7a246758d29fbff500f804 100644 (file)
@@ -1330,11 +1330,127 @@ gtk_tree_store_row_drop_possible (GtkTreeDragDest *drag_dest,
   return TRUE;
 }
 
+/* Sorting */
+typedef struct _SortTuple
+{
+  gint offset;
+  GNode *node;
+} SortTuple;
+
+static gint
+gtk_tree_store_compare_func (gconstpointer a,
+                            gconstpointer b,
+                            gpointer      user_data)
+{
+  GtkTreeStore *tree_store = user_data;
+  GtkTreeDataSortHeader *header = NULL;
+  GNode *node_a;
+  GNode *node_b;
+  GtkTreeIter iter_a;
+  GtkTreeIter iter_b;
+  gint retval;
+
+  header = _gtk_tree_data_list_get_header (tree_store->sort_list,
+                                          tree_store->sort_column_id);
+
+  g_return_val_if_fail (header != NULL, 0);
+  g_return_val_if_fail (header->func != NULL, 0);
+
+  node_a = ((SortTuple *) a)->node;
+  node_b = ((SortTuple *) b)->node;
+
+  iter_a.stamp = tree_store->stamp;
+  iter_a.user_data = node_a;
+  iter_b.stamp = tree_store->stamp;
+  iter_b.user_data = node_b;
+
+  retval = (* header->func) (GTK_TREE_MODEL (user_data),
+                            &iter_a, &iter_b,
+                            header->data);
+
+  if (tree_store->order == GTK_TREE_SORT_DESCENDING)
+    {
+      if (retval > 0)
+       retval = -1;
+      else if (retval < 0)
+       retval = 1;
+    }
+  return retval;
+}
 
 static void
-gtk_tree_store_sort (GtkTreeStore *tree_store)
+gtk_tree_store_sort_helper (GtkTreeStore *tree_store,
+                           GNode        *node)
 {
+  GtkTreeDataSortHeader *header = NULL;
+  GtkTreeIter iter;
+  GArray *sort_array;
+  GNode *tmp_node;
+  gint list_length;
+  gint i;
+  gint *new_order;
+  GtkTreePath *path;
 
+  if (node->next == NULL)
+    return;
+
+  g_assert (GTK_TREE_STORE_IS_SORTED (tree_store));
+
+  header = _gtk_tree_data_list_get_header (tree_store->sort_list, tree_store->sort_column_id);
+
+  /* We want to make sure that we have a function */
+  g_return_if_fail (header != NULL);
+  g_return_if_fail (header->func != NULL);
+
+  list_length = 0;
+  for (tmp_node = node; tmp_node; tmp_node = tmp_node->next)
+    list_length++;
+
+  sort_array = g_array_sized_new (FALSE, FALSE, sizeof (SortTuple), list_length);
+
+  i = 0;
+  for (tmp_node = node; tmp_node; tmp_node = tmp_node->next)
+    {
+      SortTuple tuple;
+
+      tuple.offset = i;
+      tuple.node = tmp_node;
+      g_array_append_val (sort_array, tuple);
+      i++;
+    }
+
+  g_array_sort_with_data (sort_array, gtk_tree_store_compare_func, tree_store);
+
+  for (i = 0; i < list_length - 1; i++)
+    {
+      g_array_index (sort_array, SortTuple, i).node->next =
+       g_array_index (sort_array, SortTuple, i + 1).node;
+      g_array_index (sort_array, SortTuple, i + 1).node->prev =
+       g_array_index (sort_array, SortTuple, i).node;
+    }
+  g_array_index (sort_array, SortTuple, list_length - 1).node->next = NULL;
+  g_array_index (sort_array, SortTuple, 0).node->prev = NULL;
+  G_NODE (tree_store->root)->children = g_array_index (sort_array, SortTuple, 0).node;
+
+  /* Let the world know about our new order */
+  new_order = g_new (gint, list_length);
+  for (i = 0; i < list_length; i++)
+    new_order[i] = g_array_index (sort_array, SortTuple, i).offset;
+  path = gtk_tree_path_new ();
+  iter.stamp = tree_store->stamp;
+  iter.user_data = NULL;
+
+  gtk_tree_model_reordered (GTK_TREE_MODEL (tree_store),
+                           path, &iter, new_order);
+  gtk_tree_path_free (path);
+  g_free (new_order);
+  g_array_free (sort_array, TRUE);
+}
+
+static void
+gtk_tree_store_sort (GtkTreeStore *tree_store)
+{
+  gtk_tree_store_sort_helper (tree_store, G_NODE (tree_store->root)->children);
 }
 
 static void
index e89ec3fa065dc3de59ba269321174ab85eba748e..a5432b930bd8ccec6718b5efc3f48307da8cd1ae 100644 (file)
@@ -1571,7 +1571,6 @@ gtk_tree_view_button_press (GtkWidget      *widget,
           tree_view->priv->press_start_y = event->y;
         }
 
-      g_print ("%d\n", event->state);
       gtk_tree_view_real_set_cursor (tree_view, path, TRUE, event->state);
 
       if (event->button == 1 && event->type == GDK_2BUTTON_PRESS)
index f8d8be52aa411fa82025398c7eb470bf84e79c22..54ff205dfb73d8cab707f189f67f6ca355a71e0b 100644 (file)
@@ -65,15 +65,15 @@ main (int argc, char *argv[])
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
 
-  model = gtk_list_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+  model = gtk_tree_store_new_with_types (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
   //  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), 0, GTK_TREE_SORT_ASCENDING);
   g_print ("start model\n");
   tree_view = gtk_tree_view_new_with_model (model);
   for (j = 0; j < 2; j++)
     for (i = 0; data[i].word_1 != NULL; i++)
       {
-       gtk_list_store_prepend (GTK_LIST_STORE (model), &iter);
-       gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+       gtk_tree_store_prepend (GTK_TREE_STORE (model), &iter, NULL);
+       gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
                            WORD_COLUMN_1, data[i].word_1,
                            WORD_COLUMN_2, data[i].word_2,
                            WORD_COLUMN_3, data[i].word_3,
index 7bf2c0636c354262ac3424ac7236d8e413ad7ba0..a8bfed3dd1cea0f6440c83e208879e4cb5b53496 100644 (file)
@@ -673,11 +673,11 @@ main (int    argc,
   models[MODEL_TREE] = create_tree_model ();
 
   model = create_list_model ();
-  models[MODEL_SORTED_LIST] = gtk_tree_model_sort_new_with_model (model, NULL, 0);
+  models[MODEL_SORTED_LIST] = gtk_tree_model_sort_new_with_model (model);
   g_object_unref (G_OBJECT (model));
 
   model = create_tree_model ();
-  models[MODEL_SORTED_TREE] = gtk_tree_model_sort_new_with_model (model, NULL, 0);
+  models[MODEL_SORTED_TREE] = gtk_tree_model_sort_new_with_model (model);
   g_object_unref (G_OBJECT (model));
 
   models[MODEL_EMPTY_LIST] = GTK_TREE_MODEL (gtk_list_store_new ());
index 9ede2222b58b0e36f475b56b36f141cb33117599..c32e8842a9798cb845bbc549b8a1774554e1dbd9 100644 (file)
@@ -224,7 +224,7 @@ make_window (gint view_type)
   GtkWidget *tree_view;
   GtkTreeViewColumn *column;
   GtkCellRenderer *cell;
-  GtkObject *selection;
+  GObject *selection;
 
   /* Make the Widgets/Objects */
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -251,14 +251,16 @@ make_window (gint view_type)
       {
        GtkTreeModel *sort_model;
        
-       sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (base_model),
-                                                        NULL, 1);
+       sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (base_model));
        tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sort_model));
       }
       break;
+    default:
+      g_assert_not_reached ();
+      break;
     }
 
-  selection = GTK_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
+  selection = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
   gtk_tree_selection_set_mode (GTK_TREE_SELECTION (selection), GTK_TREE_SELECTION_SINGLE);
 
   /* Put them together */
@@ -319,11 +321,17 @@ make_window (gint view_type)
   /* The selected column */
   cell = gtk_cell_renderer_text_new ();
   column = gtk_tree_view_column_new_with_attributes ("Node ID", cell, "markup", 0, NULL);
+  gtk_tree_view_column_set_sort_column_id (column, 0);
   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
+  g_object_unref (G_OBJECT (cell));
+  g_object_unref (G_OBJECT (column));
 
   cell = gtk_cell_renderer_text_new ();
   column = gtk_tree_view_column_new_with_attributes ("Random Number", cell, "text", 1, NULL);
+  gtk_tree_view_column_set_sort_column_id (column, 1);
   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
+  g_object_unref (G_OBJECT (cell));
+  g_object_unref (G_OBJECT (column));
 
   /* A few to start */
   if (view_type == 0)
@@ -334,9 +342,9 @@ make_window (gint view_type)
       iter_append (NULL, GTK_TREE_VIEW (tree_view));
       iter_append (NULL, GTK_TREE_VIEW (tree_view));
       iter_append (NULL, GTK_TREE_VIEW (tree_view));
+      gtk_widget_show_all (window);
     }
   /* Show it all */
-  gtk_widget_show_all (window);
 }
 
 int
@@ -348,7 +356,7 @@ main (int argc, char *argv[])
 
   /* FIXME: reverse this */
   make_window (0);
-  make_window (1);
+  //  make_window (1);
 
   gtk_main ();